整合先前幾篇所提到的一些技巧,並運用在一起,實際製作一支星座爬蟲程式
當然要先找好我們將要實作的資料來源,這邊我們使用 唐綺陽每日星座運勢 來做教學展示
(此文章內容非商業行為,僅供教學)
這次需要製作可以詢問使用者想要的星座,並給予使用者輸入相對應的回應
之後到上述的網址去尋找資訊,並使用爬蟲的技術將資料抓取回來呈現給使用者觀看今日星座運勢
import requests
from bs4 import BeautifulSoup
雙子座:
巨蟹座:
可以觀察到僅在網址的最後一段,會變化為相對應將呈現的星座名稱
為了等會方便製作使用者輸入的選項與防呆邏輯,讓我們來做個字典放這些資訊
# 星座轉換字典
zodiacSigns_convent = {
'1':'Aries',
'2':'Taurus',
'3':'Gemini',
'4':'Cancer',
'5':'Leo',
'6':'Virgo',
'7':'Libra',
'8':'Scorpio',
'9':'Sagittarius',
'10':'Capricorn',
'11':'Aquarius',
'12':'Pisces'
}
這邊會是採用 while 迴圈(前面提回圈時並未提到),可以到以下網址大致了解一下用法:
w3schools.com Python While Loops
並且在驗證的地方使用了 isdigit() 來驗證是否僅有數字
str.isdigit():如果字串裡只包含數字則回傳True,否則回傳False
其餘的地方是先前 [2021鐵人賽Day08]糊裡糊塗Python就上手-判斷是非!?(if的應用)
而迴圈中的 break 跟 pass,再次介紹一下:
break:強制跳出整個迴圈
continue:強制跳出本次迴圈,繼續進入下一階段迴圈
pass:不做任何事情,程式持續進行
# 題問說明
question_description = "[1]牡羊座 [2]金牛座 [3]雙子座 [4]巨蟹座 [5]獅子座 [6]處女座 [7]天秤座 [8]天蠍座 [9]射手座 [10]摩羯座 [11]水瓶座 [12]雙魚座,請選擇星座(僅能填數字):"
# 限制填寫內容為數字
while True:
ans_data = input(question_description)
# ans_data為數字且數值介於1~12
if ans_data.isdigit() == True and int(ans_data) > 0 and int(ans_data) < 13:
break
else:
pass
# 網址內容為唐綺陽每日星座運勢
url = 'https://www.daily-zodiac.com/mobile/zodiac/' + zodiacSigns_convent[ans_data]
response = requests.get(url)
# 設定讀取編碼(預設 UTF-8)
response.encoding = 'UTF-8'
# 檢查 HTTP 回應碼是否為 200
if response.status_code == requests.codes.ok:
sp = BeautifulSoup(response.text, 'html.parser')
zodiacSigns_name = sp.select(".middle .name .name")[0].text # 星座名稱
zodiacSigns_date = sp.select(".middle .name .date")[0].text # 星座日期
today_date = sp.select(".today li")[1].text # 今日日期
today_horoscope_weather = sp.select(".today .weather")[0].text #今日心情
# 移除字串開頭的空格 str.lstrip()
# 移除字串末尾的空格 str.rstrip()
today_horoscope = sp.select("section article")[0].text.lstrip()
# 印出結果
print('[%s %s 今日運勢]' %(zodiacSigns_name, zodiacSigns_date))
print('今日日期:%s' %(today_date))
print('今日心情:%s' %(today_horoscope_weather))
print('今日評語:\n%s' %(today_horoscope))
import requests
from bs4 import BeautifulSoup
# 星座轉換字典
zodiacSigns_convent = {
'1':'Aries',
'2':'Taurus',
'3':'Gemini',
'4':'Cancer',
'5':'Leo',
'6':'Virgo',
'7':'Libra',
'8':'Scorpio',
'9':'Sagittarius',
'10':'Capricorn',
'11':'Aquarius',
'12':'Pisces'
}
# 題問說明
question_description = "[1]牡羊座 [2]金牛座 [3]雙子座 [4]巨蟹座 [5]獅子座 [6]處女座 [7]天秤座 [8]天蠍座 [9]射手座 [10]摩羯座 [11]水瓶座 [12]雙魚座,請選擇星座(僅能填數字):"
# 限制填寫內容為數字
while True:
ans_data = input(question_description)
# ans_data為數字且數值介於1~12
if ans_data.isdigit() == True and int(ans_data) > 0 and int(ans_data) < 13:
break
else:
pass
# 網址內容為唐綺陽每日星座運勢
url = 'https://www.daily-zodiac.com/mobile/zodiac/' + zodiacSigns_convent[ans_data]
response = requests.get(url)
# 設定讀取編碼(預設 UTF-8)
response.encoding = 'UTF-8'
# 檢查 HTTP 回應碼是否為 200
if response.status_code == requests.codes.ok:
sp = BeautifulSoup(response.text, 'html.parser')
zodiacSigns_name = sp.select(".middle .name .name")[0].text # 星座名稱
zodiacSigns_date = sp.select(".middle .name .date")[0].text # 星座日期
today_date = sp.select(".today li")[1].text # 今日日期
today_horoscope_weather = sp.select(".today .weather")[0].text #今日心情
# 移除字串開頭的空格 str.lstrip()
# 移除字串末尾的空格 str.rstrip()
today_horoscope = sp.select("section article")[0].text.lstrip()
# 印出結果
print('[%s %s 今日運勢]' %(zodiacSigns_name, zodiacSigns_date))
print('今日日期:%s' %(today_date))
print('今日心情:%s' %(today_horoscope_weather))
print('今日評語:\n%s' %(today_horoscope))
查詢結果呈現如下圖所示:
唐綺陽每日星座運勢
w3schools.com Python While Loops
呼~
今天的實作終於告一段落,以上是爬蟲的簡易運用,當然也可以搭配寫入 Database 或 CSV 將資料儲存下來運用